﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <bits/stdc++.h>
using namespace std;

//int main()
//{
//	int i = 0;
//	while (cin >> i)
//	{
//		// ...
//	}
//
//	while (scanf("%d", &i) != EOF)
//	{
//		// ...
//	}
//	return 0;
//}


//
//struct ServerInfo
//{
//	char _address[32];
//	int _port;
//	Date _date;
//};
//
//// 用文件的IO流对指定配置文件进行读写
//class BinIO
//{
//public:
//	BinIO(const char* filename)
//		:_filename(filename)
//	{}
//	void Read(ServerInfo& info)
//	{
//		// 输入流与文件建立联系
//		ifstream in(_filename, ios_base::in | ios_base::binary);
//		// 从文件中读取信息到下面的变量中
//		in.read((char*)&info, sizeof(info));
//	}
//	void Write(const ServerInfo& info)
//	{
//		// 输出流与文件建立联系
//		ofstream out(_filename, ios_base::out | ios_base::binary);
//		// 从变量中读取信息到文件中
//		out.write((char*)&info, sizeof(info));
//	}
//private:
//	string _filename;
//};
//
//// 用文件的IO流对指定配置文件进行读写
//class TextIO
//{
//public:
//	TextIO(const char* filename)
//		:_filename(filename)
//	{}
//	void Read(ServerInfo& info)
//	{
//		// 输入流与文件建立联系
//		ifstream in(_filename);
//		// 从文件中读取信息到下面的变量中
//		in >> info._address >> info._port >> info._date;
//	}
//	void Write(const ServerInfo& info)
//	{
//		// 输出流与文件建立联系
//		ofstream out(_filename);
//		// 从变量中读取信息到文件中
//		out << info._address << " " << info._port << " " << info._date;
//	}
//private:
//	string _filename;
//};
//
//int main()
//{
//	ServerInfo info = { "192.0.0.1", 80, { 2022, 4, 10 } };
//	BinIO bio("test.bin");
//	bio.Write(info);
//	ServerInfo res;
//	bio.Read(res);
//	cout << res._address << endl;
//	cout << res._port << endl;
//	cout << res._date << endl;
//	return 0;
//}

//int main()
//{
//	int n = 123456;
//	char arr[128];
//	sprintf(arr, "%d", n);
//	return 0;
//}

//int main()
//{
//	int n = 123456;
//	string str;
//	stringstream s;
//	s << n;
//	s >> str;
//	return 0;
//}

//int main()
//{
//	stringstream s;
//	s << "这是第一串内容" << " ";
//	s << "这是第二串内容" << " ";
//	cout << s.str() << endl;
//	string str;
//
//	// 下面的过程有点像从缓冲区中拿内容
//	s >> str;
//	cout << str << endl;
//	s >> str;
//	cout << str << endl;
//	return 0;
//}

class Date
{
	friend ostream& operator << (ostream& out, const Date& d);
	friend istream& operator >> (istream& in, Date& d);
public:
	Date(int year = 1, int month = 1, int day = 1)
		:_year(year)
		, _month(month)
		, _day(day)
	{}
private:
	int _year;
	int _month;
	int _day;
};
istream& operator >> (istream& in, Date& d)
{
	in >> d._year >> d._month >> d._day;
	return in;
}
ostream& operator << (ostream& out, const Date& d)
{
	out << d._year << " " << d._month << " " << d._day;
	return out;
}

struct ChatInfo
{
	string _name;
	int _id;
	Date _date;
	string _msg;
};

int main()
{
	// 结构信息序列化为字符串
	ChatInfo winfo = { "张三", 135246, { 2022, 4, 10 }, "晚上一起看电影吧" };
	ostringstream oss;
	oss << winfo._name << " " << winfo._id << " " << winfo._date << " " << winfo._msg;
	string str = oss.str();
	cout << str << endl << endl;

	// 经过一些传递，传递到了当前位置，现在要对这个字符串流进行解析
	ChatInfo rInfo;
	istringstream iss(str);
	// 直接从这个字符串流中进行信息的读取和解析
	iss >> rInfo._name >> rInfo._id >> rInfo._date >> rInfo._msg;
	cout << "姓名：" << rInfo._name << "(" << rInfo._id << ") ";
	cout << rInfo._date << endl;
	cout << rInfo._name << ":>" << rInfo._msg << endl;
	return 0;
}